www.gusucode.com > VC++仿XP免费Prof UIS界面库-源码程序 > VC++仿XP免费Prof UIS界面库-源码程序/code/Samples/AviFrames/AviPlayer.cpp
//Download by http://www.NewXing.com // AviPlayer.cpp: implementation of the CAviPlayer class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "aviframes.h" #include "AviPlayer.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// IMPLEMENT_DYNCREATE( CAviPlayer, CObject ); ////////////////////////////////////////////////////////////////////////// CAviPlayer::CAviPlayer(CWnd *pWndParent) : m_pAviStream( NULL ) , m_pGetFrame( NULL ) , m_nAviWidth( 0 ) , m_nAviHeight( 0 ) , m_nRenderWidth( 0 ) , m_nRenderHeight( 0 ) , m_hDrawDib( NULL ) , m_nFrameNumber( 0 ) , m_nFrameCount( 0 ) , m_nFrameSkiped(0) , m_pAviPlayerWnd(NULL) , m_bIsPlaying( FALSE ) , m_bTempPause( FALSE ) { AVIFileInit(); m_pAviPlayerWnd = new CAviPlayerWnd(this); m_pAviPlayerWnd->Create( pWndParent ); } ////////////////////////////////////////////////////////////////////////// CAviPlayer::~CAviPlayer() { if( m_pAviPlayerWnd ){ m_pAviPlayerWnd->DestroyWindow(); delete m_pAviPlayerWnd; m_pAviPlayerWnd = NULL; } Clean(); AVIFileExit(); } ////////////////////////////////////////////////////////////////////////// void CAviPlayer::Clean() { if( m_hDrawDib != NULL ){ ::DrawDibClose( m_hDrawDib ); m_hDrawDib = NULL; } if( m_pGetFrame != NULL ){ ::AVIStreamGetFrameClose( m_pGetFrame ); m_pGetFrame = NULL; } if( m_pAviStream != NULL ){ ::AVIStreamRelease( m_pAviStream ); m_pAviStream = NULL; } ::DrawDibEnd(m_hDrawDib); ::DrawDibClose(m_hDrawDib); m_hDrawDib = NULL; } ////////////////////////////////////////////////////////////////////////// BOOL CAviPlayer::Prepare() { AVIStreamInfo( m_pAviStream, &m_AviInfo, sizeof(m_AviInfo) ); m_nRenderWidth = m_nAviWidth = m_AviInfo.rcFrame.right - m_AviInfo.rcFrame.left; m_nRenderHeight = m_nAviHeight = m_AviInfo.rcFrame.bottom - m_AviInfo.rcFrame.top; SetPlayerWindowPos(0,0,m_nRenderWidth,m_nRenderHeight); //get start position and count of frames m_nFrameNumber = AVIStreamStart( m_pAviStream ); m_nFrameCount = AVIStreamLength( m_pAviStream ); m_pGetFrame = ::AVIStreamGetFrameOpen( m_pAviStream, NULL ); if( m_pGetFrame == NULL ) { ASSERT( FALSE ); AfxMessageBox( _T("AVI frame initialization failed"), MB_OK|MB_ICONERROR ); return FALSE; } m_hDrawDib = ::DrawDibOpen(); if( m_hDrawDib == NULL ) { ASSERT( FALSE ); AfxMessageBox( _T("DrawDibOpen() failed"), MB_OK|MB_ICONERROR ); return FALSE; } return TRUE; } ////////////////////////////////////////////////////////////////////////// BOOL CAviPlayer::OpenFromFile( LPCTSTR sAviFilePath ) { Clean(); if( ::AVIStreamOpenFromFile( &m_pAviStream, sAviFilePath, streamtypeVIDEO, 0, OF_READ, NULL ) != 0 ) { Clean(); ASSERT( FALSE ); AfxMessageBox( _T("AVI stream initialization failed"), MB_OK|MB_ICONERROR ); return FALSE; } BOOL bRet = Prepare(); return bRet; } ////////////////////////////////////////////////////////////////////////// BOOL CAviPlayer::DrawFrame( HDC hDC, int nFrameNumber ) { LPBITMAPINFOHEADER lpbi; lpbi = (LPBITMAPINFOHEADER) ::AVIStreamGetFrame( m_pGetFrame, nFrameNumber ); if(!lpbi) return FALSE; unsigned char * pAviFrameRawData = (unsigned char *) lpbi + lpbi->biSize + lpbi->biClrUsed * sizeof(RGBQUAD); unsigned char * pDibRawData = NULL; HBITMAP hBitmap = ::CreateDIBSection( hDC, (BITMAPINFO*)(lpbi), DIB_RGB_COLORS, (void**)(&pDibRawData), NULL, NULL ); if( hBitmap == NULL ) { ASSERT( FALSE ); AfxMessageBox( _T("Failed to create DIB section"), MB_OK|MB_ICONERROR ); return FALSE; } ASSERT( pDibRawData != NULL ); ::DrawDibDraw( m_hDrawDib, hDC, 0, 0, m_nRenderWidth, m_nRenderHeight, lpbi, pAviFrameRawData, 0, 0, m_nAviWidth, m_nAviHeight, 0 ); DeleteObject(hBitmap); return TRUE; } //////////////////////////////////////////////////////////////////////////